A virtual disk for a virtual machine (VM) may consist of a collection of files stored on an underlying file system. For example, the virtual disk may contain a metadata file, referred to herein as the “descriptor file,” and at least one data file, referred to herein as the “extent file.” The extent file stores the virtual disk's data, which is accessible to the VM. The descriptor file contains metadata accessible to the host's core virtualization stack for management of the extent file. For example, the descriptor file points to one or more extent files to indicate which extent files belong to the virtual disk and to provide the layout of a virtual disk. The descriptor and extent files for a virtual disk are migrated, cloned, and otherwise copied together.
Virtual disk I/O filters are plug-ins/pluggable code modules that are able to intercept and, if applicable, modify VM I/O requests directed to corresponding virtual disks owned by the VMs. In doing so, these filters may use and/or create data/metadata that needs to be stored. I/O filter data shouldn't be simply stored in a global location because it must be able to be easily migrated, cloned, and otherwise copied along with the virtual disk. Virtual disk I/O filters, however, may create too much data/metadata to be stored in the descriptor file. For example, a filter may require many megabytes or even gigabytes of storage space (e.g., for caching or storage of hashes), but a typical descriptor file is very small, on the order of a few kilobytes. Ballooning the size of the descriptor file to accommodate I/O filter data would severely impact performance and maintainability of the virtual disk. Additionally, such metadata should not stored in the extent file, which may be limited to the VM's data.